package mr

import "strings"

/* TagFile文件格式说明
 * TagFile能够存储Tag格式和非Tag格式的文件名称
 * [Tag格式]  : FileName = Head-X-Y.FileType
 * [非Tag格式]: FileName = Head.FileType
 *
 */

type TagFile struct {
	FileName string // 中间文件的完整名称(带后缀)
	Head_tag string // 头部文件标号
	X_tag    string // X标志
	Y_Tag    string // Y标志
	FileType string // 文件类型后缀
}

// 生成非TagFile格式文件
func GenFileNoTag(filename string) TagFile {
	lis := strings.Split(filename, ".")
	tf := TagFile{
		FileName: filename,
		Head_tag: lis[0],
		FileType: lis[1],
		X_tag:    "",
		Y_Tag:    "",
	}
	return tf
}

// 生成TagFile文件
func GenTagFile(filename string) TagFile {
	tf := TagFile{}
	tf.ParseFile(filename)
	return tf
}

func (mf *TagFile) ParseFile(filename string) {
	mf.FileName = filename
	splis := strings.Split(filename, ".")
	mf.FileType = splis[1]
	pref := strings.Split(splis[0], "-")
	mf.Head_tag = pref[0]
	mf.X_tag = pref[1]
	mf.Y_Tag = pref[2]
}

func (mf *TagFile) GetFileName() string {
	return mf.FileName
}

func (mf *TagFile) GetTag_X() string {
	return mf.X_tag
}

func (mf *TagFile) GetTag_Y() string {
	return mf.Y_Tag
}

// 根据Y标记整理文件
type OutputFilePool struct {
	FileList []TagFile      // 结果文件存储列表
	TagVisX  map[string]int // tag存在个数标记
	TagVisY  map[string]int // tag存在个数标记
}

// 初始化
func (ofp *OutputFilePool) Init_Pool() {
	ofp.FileList = make([]TagFile, 0)
	ofp.TagVisX = make(map[string]int)
	ofp.TagVisY = make(map[string]int)
}

// 插入一个标准Tag文件
func (ofp *OutputFilePool) InsertTagFile(tagfile *TagFile) {
	ofp.FileList = append(ofp.FileList, GenTagFile(tagfile.FileName))
	ofp.TagVisX[tagfile.GetTag_X()]++
	ofp.TagVisY[tagfile.GetTag_Y()]++
}

// 获取所有存在的X标记
func (ofp *OutputFilePool) GetTags_X() []string {
	lis := make([]string, 0)
	for tagx := range ofp.TagVisX {
		lis = append(lis, tagx)
	}
	return lis
}

// 获取所有存在的Y标记
func (ofp *OutputFilePool) GetTags_Y() []string {
	lis := make([]string, 0)
	for tagy := range ofp.TagVisY {
		lis = append(lis, tagy)
	}
	return lis
}

// 获取指定X标记类型的文件列表
func (ofp *OutputFilePool) GetTagFiles_X(tag string) []TagFile {
	lis := make([]TagFile, 0)
	for _, tf := range ofp.FileList {
		if tf.GetTag_X() == tag {
			lis = append(lis, GenTagFile(tf.FileName))
		}
	}
	return lis
}

// 获取指定Y标记类型的文件列表
func (ofp *OutputFilePool) GetTagFiles_Y(tag string) []TagFile {
	lis := make([]TagFile, 0)
	for _, tf := range ofp.FileList {
		if tf.GetTag_Y() == tag {
			lis = append(lis, GenTagFile(tf.FileName))
		}
	}
	return lis
}
